Programa ::= Bloque

--Bloque ::= int IDEN RDeclaraciones & Instrucciones
	Bloque.a = bloqueR1(RDeclaraciones.a, Instrucciones.a)
	RDeclaraciones.ah = DeclaracionesR2(declaracionR1(tipoR1(), IDEN.lex))
	
--Bloque ::= boolean IDEN RDeclaraciones & Instrucciones
	Bloque.a = bloqueR1(RDeclaraciones.a, Instrucciones.a)
	RDeclaraciones.ah = DeclaracionesR2(declaracionR1(tipoR2(), IDEN.lex))

--Bloque ::= array [NUM] of Tipo IDEN RDeclaraciones & Instrucciones
	Bloque.a = bloqueR1(RDeclaraciones.a, Instrucciones.a)
	RDeclaraciones.ah = DeclaracionesR2(declaracionR1(tipoR3(NUM.lex, Tipo.a), IDEN.lex))

--Bloque ::= record { Campos } IDEN RDeclaraciones & Instrucciones
	Bloque.a = bloqueR1(RDeclaraciones.a, Instrucciones.a)
	RDeclaraciones.ah = DeclaracionesR2(declaracionR1(tipoR4(Campos.a), IDEN.lex))

--Bloque ::= ^ Tipo IDEN RDeclaraciones & Instrucciones
	Bloque.a = bloqueR1(RDeclaraciones.a, Instrucciones.a)
	RDeclaraciones.ah = DeclaracionesR2(declaracionR1(tipoR5(Tipo.a), IDEN.lex))

--Bloque ::= type Tipo IDEN RDeclaraciones & Instrucciones
	Bloque.a = bloqueR1(RDeclaraciones.a, Instrucciones.a)
	RDeclaraciones.ah = DeclaracionesR2(declaracionR2(Tipo.a, IDEN.lex))

--Bloque ::= proc IDEN ( ParametrosFormales ) { Bloque } RDeclaraciones & Instrucciones
	Bloque.a = bloqueR1(RDeclaraciones.a, Instrucciones.a)
	RDeclaraciones.ah = DeclaracionesR2(declaracionR3(IDEN.lex, ParametrosFormales.a, Bloque.a))

--Bloque ::= INew RInstrucciones
	Bloque.a = bloqueR2(RInstrucciones.a)
	RInstrucciones.ah = instruccionesR2(instruccionR2(INew.a))
--Bloque ::= IDispose RInstrucciones
	Bloque.a = bloqueR2(RInstrucciones.a)
	RInstrucciones.ah = instruccionR3(IDispose.a)
--Bloque ::= IRead RInstrucciones
	Bloque.a = bloqueR2(RInstrucciones.a)
	RInstrucciones.ah = instruccionR4(IRead.a)
--Bloque ::= IWrite RInstrucciones
	Bloque.a = bloqueR2(RInstrucciones.a)
	RInstrucciones.ah = instruccionR5(IWrite.a)
--Bloque ::= IIF RInstrucciones
	Bloque.a = bloqueR2(RInstrucciones.a)
	RInstrucciones.ah = instruccionR7(IIF.a)
--Bloque ::= IDO RInstrucciones
	Bloque.a = bloqueR2(RInstrucciones.a)
	RInstrucciones.ah = instruccionR8(IDO.a)
_____________________________________________________________________________________________________
	[Bloque ::= IDEN IDEN RDeclaraciones & Instrucciones]
			Bloque.a = bloqueR1(RDeclaraciones.a, Instrucciones.a)
			RDeclaraciones.ah = DeclaracionesR2(declaracionR1(tipoR6(IDEN(0).lex), IDEN(1).lex))

	[Bloque ::= IDEN RI RInstrucciones]
			Bloque.a = bloqueR2(RInstrucciones.a)
			RInstrucciones.ah = instruccionesR2(RI.a)
			RI.ah = IDEN.lex
_______________________________________________________________________________________________________
			
--Bloque ::= IDEN RBloque
	Bloque.a = RBloque.a
	RBloque.ah = IDEN.lex
--RBloque ::= IDEN RDeclaraciones & Instrucciones
	RBloque.a = bloqueR1(RDeclaraciones.a, Instrucciones.a)
	RDeclaraciones.ah = DeclaracionesR2(declaracionR1(tipoR6(RBloque.ah), IDEN.lex))
--RBloque ::= RI RInstrucciones
	RBloque.a = bloqueR2(RInstrucciones.a)
	RInstrucciones.ah = instruccionesR2(RI.a)
	RI.ah = RBloque.ah


--Declaraciones ::= int IDEN RDeclaraciones
	Declaraciones.a = RDeclaraciones.a
	RDeclaraciones.ah = DeclaracionesR2(declaracionR1(tipoR1(), IDEN.lex))
--Declaraciones ::= boolean IDEN RDeclaraciones
	Declaraciones.a = RDeclaraciones.a
	RDeclaraciones.ah = DeclaracionesR2(declaracionR1(tipoR2(), IDEN.lex))
--Declaraciones ::= array [NUM] of Tipo IDEN RDeclaraciones
	Declaraciones.a = RDeclaraciones.a
	RDeclaraciones.ah = DeclaracionesR2(declaracionR1(tipoR3(NUM.lex, Tipo.a), IDEN.lex))
--Declaraciones ::= record { Campos } IDEN RDeclaraciones
	Declaraciones.a = RDeclaraciones.a
	RDeclaraciones.ah = DeclaracionesR2(declaracionR1(tipoR4(Campos.a), IDEN.lex))
--Declaraciones ::= ^ Tipo IDEN RDeclaraciones
	Declaraciones.a = RDeclaraciones.a
	RDeclaraciones.ah = DeclaracionesR2(declaracionR1(tipoR5(Tipo.a), IDEN.lex))
--Declaraciones ::= IDEN IDEN RDeclaraciones
	Declaraciones.a = RDeclaraciones.a
	RDeclaraciones.ah = DeclaracionesR2(declaracionR1(tipoR6(IDEN(0).lex), IDEN(1).lex))
--Declaraciones ::= type Tipo IDEN RDeclaraciones
	Declaraciones.a = RDeclaraciones.a
	RDeclaraciones.ah = DeclaracionesR2(declaracionR2(Tipo.a, IDEN.lex))
--Declaraciones ::= proc IDEN ( ParametrosFormales ) { Bloque } RDeclaraciones
	Declaraciones.a = RDeclaraciones.a
	RDeclaraciones.ah = DeclaracionesR2(declaracionR3(IDEN.lex, ParametrosFormales.a, Bloque.a))

RDeclaraciones ::= ; Declaracion RDeclaraciones
RDeclaraciones ::= vacio

--Declaracion ::= int IDEN
	Declaracion.a = declaracionR1(tipoR1(), IDEN.lex)
--Declaracion ::= boolean IDEN
	Declaracion.a = declaracionR1(tipoR2(), IDEN.lex)
--Declaracion ::= array [NUM] of Tipo IDEN
	Declaracion.a = declaracionR1(tipoR3(NUM.lex, Tipo.a), IDEN.lex)
--Declaracion ::= record { Campos } IDEN
	Declaracion.a = declaracionR1(tipoR4(Campos.a), IDEN.lex)
--Declaracion ::= ^ Tipo IDEN
	Declaracion.a = declaracionR1(tipoR5(Tipo.a), IDEN.lex)
--Declaracion ::= IDEN IDEN
	Declaracion.a = declaracionR1(tipoR6(IDEN(0).lex), IDEN(1).lex)
Declaracion ::= type Tipo IDEN
Declaracion ::= proc IDEN ( ParametrosFormales ) { Bloque }

ParametrosFormales ::= ListaParametrosFormales
ParametrosFormales ::= vacio

ListaParametrosFormales ::= ParametroFormal RListaParametrosFormales
RListaParametrosFormales ::= , ParametroFormal RListaParametrosFormales
RListaParametrosFormales ::= vacio

ParametroFormal ::= Tipo IDEN
ParametroFormal ::= var Tipo IDEN

Tipo ::= int
Tipo ::= boolean
Tipo ::= array [NUM] of Tipo
Tipo ::= record{ Campos }
Tipo ::= ^ Tipo
Tipo ::= IDEN

Campos ::= Campo RCampos
RCampos ::= ; Campo RCampos
RCampos ::= vacio

Campo ::= Tipo IDEN

[me han desaparecido R1 y R6 correspondientes a IAsignacion e ILlamada]
--Instrucciones ::= IDEN RI RInstrucciones
	Instrucciones.a = RInstrucciones.a
	RInstrucciones.ah = instruccionesR2(RI.a)
	RI.ah = IDEN.lex
--Instrucciones ::= INew RInstrucciones
	Instrucciones.a = RInstrucciones.a
	RInstrucciones.ah = instruccionesR2(instruccionR2(INew.a))
--Instrucciones ::= IDispose RInstruccionesins
	Instrucciones.a = RInstrucciones.a
	RInstrucciones.ah = instruccionR3(IDispose.a)
--Instrucciones ::= IRead RInstrucciones
	Instrucciones.a = RInstrucciones.a
	RInstrucciones.ah = instruccionR4(IRead.a)
--Instrucciones ::= IWrite RInstrucciones
	Instrucciones.a = RInstrucciones.a
	RInstrucciones.ah = instruccionR5(IWrite.a)
--Instrucciones ::= IIF RInstrucciones
	Instrucciones.a = RInstrucciones.a
	RInstrucciones.ah = instruccionR7(IIF.a)
--Instrucciones ::= IDO RInstrucciones
	Instrucciones.a = RInstrucciones.a
	RInstrucciones.ah = instruccionR8(IDO.a)


RInstrucciones ::= ; Instruccion RInstrucciones
RInstrucciones ::= vacios
_________________________________________________
		Instruccion ::= IDEN ( ParametrosReales )
			Instruccion.a = iLlamadaR1(IDEN.lex, ParametrosReales.a)
		Instruccion ::= IDEN RRMem := Exp0
			Instruccion.a = instruccionR1(iAsignacionR1(RRMem.a, Exp0.a))
			RRMem.ah = memR1(IDEN.lex)
_________________________________________________		
--Instruccion ::= IDEN RI
	Instruccion.a = RI.a
	RI.ah = IDEN.lex
--RI ::= (ParametrosReales)
	RI.a = iLlamadaR1(RI.ah, ParametrosReales.a)
--RI ::= RRMem := Exp0
	RI.a = instruccionR1(iAsignacionR1(RRMem.a, Exp0.a))
	RRMem.ah = memR1(IDEN.lex)
Instruccion ::= INew
Instruccion ::= IDispose
Instruccion ::= IRead
Instruccion ::= IWrite
Instruccion ::= IIF
Instruccion ::= IDO

ILlamada ::= IDEN ( ParametrosReales )

ParametrosReales ::= vacio
ListaParametrosReales ::= Exp0 RListaParametrosReales					
RListaParametrosReales ::= , Exp0 RListaParametrosReales
RListaParametrosReales ::= vacio

[Creo que se borra]
--IAsignacion ::= IDEN RRMem := Exp0
	IAsignacion.a = iAsignacionR1(RRMem.a, Exp0.a)
	RRMem.ah = memR1(IDEN.lex)
	
INew ::= new Mem
IDispose ::= dispose Mem
IRead ::= read Mem			
IWrite ::= write Exp0
IIF ::= if Casos fi
IDO ::= do Casos od

Casos ::= Caso RCasos
RCasos ::= [] Caso RCasos
RCasos ::= vacio

Caso ::= case Exp0 -> Instrucciones

Exp0 ::= Exp1 RExp0
RExp0 ::= OpComparacion Exp1
RExp0 ::= vacio

Exp1 ::= Exp2 RExp1
RExp1 ::= OpAditivo Exp2 RExp1
RExp1 ::= vacio

Exp2 ::= Exp3 RExp2
RExp2 ::= OpMultiplicativo Exp3 RExp2
RExp2 ::= vacio

Exp3 ::= OpUnario Exp3
Exp3 ::= Exp4

Exp4 ::= true
Exp4 ::= false
Exp4 ::= NUM
Exp4 ::= Mem
Exp4 ::= ( Exp0 )

Mem ::= IDEN RMem
RMem ::= [Exp0] RMem
RMem ::= .IDEN RMem
RMem ::= ^ RMem
RMem ::= vacio

OpComparacion ::= eq
OpComparacion ::= neq
OpComparacion ::= gt
OpComparacion ::= ge
OpComparacion ::= lt
OpComparacion ::= le
OpAditivo ::= +
OpAditivo ::= -
OpAditivo ::= or
OpMultiplicativo ::= *
OpMultiplicativo ::= /
OpMultiplicativo ::= and
OpUnario ::= -
OpUnario ::= not